Geonodes Part 3

image-39.png


УРОВЕНЬ 2: ПРОДВИНУТЫЕ КОНЦЕПЦИИ

Введение в Уровень 2

Цель уровня: Освоить глубокие концепции Fields и Attributes, полностью разобраться с математикой и векторами, научиться использовать текстуры для деформации, начать применять Raycast и Proximity для взаимодействия геометрий.

Требования: Уровень 1 полностью пройден, понимание базовых нод

Время обучения: 5-7 недель при регулярной практике (4-6 часов в день)

Ожидаемый результат: Вы сможете создавать сложные процедурные системы, работать с данными через атрибуты, создавать параметрические модели


МОДУЛЬ 2.1: FIELDS И ATTRIBUTES — РАСШИРЕННЫЙ МАСТЕР-КЛАСС

Концепция: Fields vs Attributes — фундаментальное различие

Attribute = Data хранимые на геометрии

Geometry содержит:
- Position (где находится каждая вершина)
- Normal (в каком направлении смотрит поверхность)
- UV (координаты текстуры)
- Vertex Color (цвет каждой вершины)
- Custom attributes (ваши собственные данные)

Field = Инструкция вычисления значения

Field = Функция которая вычисляет значение для каждого элемента в момент использования

Ключевое различие:

  • Attribute = "вот это значение прямо сейчас"
  • Field = "инструкция как это вычислить"

Ключевые ноды (УРОВЕНЬ 2.1)

Position Node — Получение позиции

Назначение: Получить (X, Y, Z) координаты каждой вершины/точки

Важно: Position это field, а не атрибут!

  • При каждом использовании позиция переоценивается
  • После деформации Position даст новые координаты
  • Для сохранения ИСХОДНОЙ позиции используйте Capture Attribute

Пример:

Position node (текущие координаты)
  ↓
Math (Multiply по Z на 2)
  ↓
Set Position Offset (поднять в два раза)

Capture Attribute — Замораживание значения

Назначение: "Заморозить" field в конкретный момент, преобразуя в anonymous attribute

Как это работает:

Field → Capture Attribute → сохраняется текущее значение
                           ↓
                    может быть использовано где угодно
                    но как фиксированное значение

Ключевое отличие от Store Named Attribute:

  • Capture = временный, anonymous (имени нет)
  • Store Named = постоянный, имеет имя, видим в Shader Editor

Когда использовать Capture:

  • Быстрые операции внутри одной цепи нод
  • Когда не нужно экспортировать в материалы
  • Для лучшей производительности

Пример практического использования:

ПРОБЛЕМА: Хотим сохранить ИСХОДНУЮ позицию перед деформацией

РЕШЕНИЕ:
Position → Capture Attribute (сохранили оригинальную позицию)
                ↓
        (далее в tree...)
        Noise Texture + Set Position (деформировали)
                ↓
        Named Attribute (get captured original position) → используем для сравнения

Store Named Attribute — Именованное сохранение

Назначение: Сохранить данные с именем для использования везде (включая Shader Editor)

Входы:

  • Geometry — исходная геометрия
  • Attribute — значение/field для сохранения
  • Name — как называть атрибут (строка текста)
  • Domain — где хранить (Point, Edge, Face, Corner, Spline)

Выход: Геометрия с новым атрибутом (зелёный провод)

ВАЖНО: Геометрия ДОЛЖНА пройти ЧЕрез Store Named Attribute!

ПРАВИЛЬНО:
Position → Store Named Attribute → Group Output

НЕПРАВИЛЬНО:
Position → Store Named Attribute (но геометрия не проходит!)

Когда использовать Store Named:

  • Нужно экспортировать в Shader Editor
  • Нужно передавать между node groups
  • Нужен persistent атрибут

Пример в Shader Editor:

GN создал: Store Named Attribute (name: "my_color", значение: Color)
           ↓
Shader Editor: Attribute Node (name: "my_color") → подключить к Principled BSDF

Named Attribute — Чтение именованного атрибута

Назначение: Прочитать атрибут по имени

Как работает:

Store Named Attribute (создали "custom_value")
              ↓
Named Attribute ("custom_value") ← читаем
              ↓
используем значение где угодно

Домены атрибутов (критически важно!)

Домен Где хранится Пример Когда использовать
Point На вершинах Position, Vertex Colors Работа с вершинами mesh
Edge На рёбрах Edge Weight Тонкие линии, проводка
Face На лицах Материал face Разные материалы на грани
Corner На углах граней UV Maps Текстурирование
Spline На сплайнах кривой Spline Width Кривые, волосы

ВАЖНО: Атрибут существует ТОЛЬКО в его домене!

Пример проблемы:

Store Named Attribute на Face домене
           ↓
Named Attribute на Face домене ✓ (работает)
           ↓
Distribute Points on Faces (создаёт Point домен)
           ↓
Named Attribute на Point домене ✗ (ОШИБКА! нет атрибута в Point домене)

Решение: Преобразовать домен ПЕРЕД использованием атрибута


Лучшие туториалы (УРОВЕНЬ 2.1)

Обязательные базовые

  1. Simon Thommes - Fields Theory - Blender Studio

    • Сводка: Официальный курс от разработчика Geometry Nodes! Очень подробное объяснение.
    • Версия: Актуально для 3.0+
    • Длительность: ~1 час
    • Уровень: Средний
    • ОБЯЗАТЕЛЬНО: Смотрите целиком!
  2. A guide to attributes & fields - YouTube

    • Сводка: Визуальное объяснение с примерами. Очень понятно.
    • Длительность: ~28 минут
    • Уровень: Новичок-Средний
    • Изучите: Базовые концепции, домены
  3. How to Use Store Named Attribute - YouTube

    • Сводка: Практические примеры Store Named Attribute с real-world cases.
    • Длительность: ~15 минут
    • Уровень: Начинающий
  4. Store Named Attribute Demystified - YouTube

    • Сводка: Развенчание мифов, от Josh Gambrell (опытный пользователь).
    • Длительность: ~22 минуты
    • Уровень: Средний
    • Важность: ВЫСОКАЯ

Для среднего уровня

  1. Attributes Reference - Blender Manual

    • Сводка: Полный справочник всех встроенных атрибутов.
    • Формат: Справочная документация
    • Рекомендация: Используйте как справочник
  2. Fields Documentation - Blender Manual

    • Сводка: Официальное объяснение полей с диаграммами.
    • Формат: Документация
    • Используйте: Для глубокого понимания

Специальные техники

  1. Attribute transfer between geometries - YouTube

    • Сводка: Использование Sample Index / Sample Nearest для передачи данных.
    • Длительность: ~25 минут
    • Уровень: Средний-Сложный
  2. Domain conversion techniques - BlenderArtists

    • Сводка: Как переводить атрибуты между доменами.
    • Формат: Форумное обсуждение
    • Полезность: Высокая

Распространённые проблемы и решения (УРОВЕНЬ 2.1)

Проблема 1: "Attributes не сохраняются"

Диагностика:

Store Named Attribute добавлена, но атрибут не видим в Shader Editor

Причина:
Зелёный провод "Geometry" не проходит ЧЕРЕЗ Store Named Attribute

Решение:

Group Input Geometry → Store Named Attribute → Group Output

НЕ НУЖНО:
Group Input Geometry ↓
                    Store Named Attribute (не используется!)
                    ↓
                Group Output

Диагностика: Используйте Spreadsheet Editor (Window → Toggle Sidebar → выберите Spreadsheet)


Проблема 2: "Capture Attribute захватывает неправильные значения"

Причина:
Не понимание когда field оценивается.

Концепция:

  • Fields оцениваются КОГДА ИСПОЛЬЗУЮТСЯ, а не когда созданы
  • Capture Attribute "замораживает" field В МОМЕНТ ПРОХОЖДЕНИЯ через ноду

Пример:

Position (это field! переоценится везде где используется)
    ↓
Set Position (измен позицию) ← Position field переоценится ЗА ЭТОЙ нодой!
    ↓
Capture Attribute ← слишком поздно, захватим новую позицию!

Правильно:

Position (оригинальная позиция)
    ↓
Capture Attribute (ЗАХВАТИЛИ оригинальную позицию)
    ↓
Set Position (изменили позицию)
    ↓
Named Attribute (читаем ОРИГИНАЛЬНУЮ позицию)

Проблема 3: "Named Attribute не видны в Shader Editor"

Проверочный список:

  1. Имя совпадает точно (case-sensitive!)
  2. Domain правильный (обычно Point/Vertex)
  3. Geometry проходит через Store Named Attribute
  4. Modifier применён (Preview mode или Apply)
  5. В Attribute node Shader Editor указано правильное имя

Решение пошагово:

Шаг 1: В GN создайте Store Named Attribute (name: "custom_color", domain: Point)
Шаг 2: Убедитесь что зелёный провод проходит через эту ноду
Шаг 3: В Shader Editor добавьте Attribute node (name: "custom_color", domain: Point)
Шаг 4: Подключите к Principled BSDF
Шаг 5: Если не работает, переключитесь в Preview или Apply modifier

Проблема 4: "Domain mismatch — данные на неправильном домене"

Сценарий:

Store на Face домене → Distribute Points (создаёт Point домен) → можно ли читать?

Ответ: НЕТ! Нужно преобразовать домен.

Решение: Использовать правильные ноды для преобразования:

Из домена В домен Используйте
Point → Face Interpolate Domain
Face → Point Store на исходной геометрии перед Distribute Points

Лайфхаки от профессионалов

"Freeze" техника

Нужно сохранить ИСХОДНОЕ состояние перед деформацией:

Group Input Geometry
    ↓
Capture Attribute (name: "original_position", value: Position node)
    ↓ (сохранили оригинальную позицию)
[сложные операции - трансформации, деформации]
    ↓
Named Attribute ("original_position") → используем для сравнения/восстановления

Named conventions

Используйте префиксы для группировки атрибутов:

v_color      = вершинный цвет (Point домен)
v_random     = random значение на вершине
f_material   = материал на лице (Face домен)
uv_main      = главные UV (Corner домен)
sp_width     = ширина сплайна (Spline домен)

Это сильно улучшает читаемость node tree'я!


Debug workflow

Быстрая визуализация атрибутов:

1. Store Named Attribute (name: "debug_value", domain: Point)
                ↓
2. В Shader Editor: Attribute → Color Ramp (для красивого отображения)
                ↓
3. Viewer Node с красивой визуализацией

Практический проект P2.1: "Параметрическая колоннада"

Сложность: Средний
Время: 2-3 часа
Используемые ноды: Distribute Points, Instance on Points, Store Named Attribute, Random Value

Описание:
Создание процедурной колоннады с разными типами столбов, которые размещаются вдоль кривой с полным контролем через параметры.

Что вы изучите:

  • Использование Store Named Attribute для сохранения данных
  • Параметризация сложной системы
  • Работа с Collection для разных типов элементов
  • Оптимизация через инстансы

МОДУЛЬ 2.2: MATH И VECTOR MATH — ПОЛНОЕ ПОГРУЖЕНИЕ

Концепция: Math — основа процедурности

Все процедурные системы строятся на математике:

Паттерны (повторение) → Modulo
Анимация (движение) → Sine, Cosine
Условия (выбор) → Compare, Switch
Плавность (blend) → Smoothstep, Clamp, Map Range
Расстояния (близость) → Distance, Length

Vector Math — Ключевые операции

Dot Product (A · B) — Скалярное произведение

Формула: \( A \cdot B = |A| \times |B| \times \cos(\theta) \)

Результат: Single number (скалар)

Для normalized vectors (длина = 1):

  • = 1: Параллельны, одно направление (angle = 0°)
  • = 0: Перпендикулярны (angle = 90°)
  • = -1: Параллельны, противоположное направление (angle = 180°)

Применение:

  • Углы между векторами
  • Similarity check (насколько похожи направления)
  • Lighting calculations (Normal · Light)
  • ВАЖНО: Всегда Normalize перед Dot Product!

Пример (Lighting):

Normal node (направление поверхности)
    ↓ Normalize
Light Direction (from target)
    ↓ Normalize
Dot Product → результат от -1 до 1 (освещение)

Cross Product (A × B) — Векторное произведение

Результат: Вектор перпендикулярный обоим A и B

Направление: Right-hand rule (закрутить пальцы от A к B, большой палец = результат)

Важное: A×B = -(B×A) (порядок имеет значение!)

Применение:

  • Создание perpendicular vector (ортогональные оси)
  • Surface normals calculation
  • Rotation axes
  • Лайфхак: Normal × Tangent = Bitangent (complete coordinate frame)

Map Range — переопределение диапазона

Назначение: Преобразовать значение из одного диапазона в другой

Входы:

  • Value — входное значение
  • From Min/Max — диапазон входа
  • To Min/Max — диапазон выхода
  • Clamp — ограничить ли результат выходным диапазоном

Формула:
\( \text{result} = \text{To Min} + (\text{value} - \text{From Min}) \times \frac{\text{To Max} - \text{To Min}}{\text{From Max} - \text{From Min}} \)

Пример (falloff с distance):

Distance to target: от 0 до 10 метров
Хотим: от 1.0 (близко) до 0.0 (далеко)

Map Range:
- From Min: 0
- From Max: 10
- To Min: 1.0
- To Max: 0.0
- Clamp: включить

Math Node — Все операции

Trigonometric (тригонометрия)

Sine, Cosine, Tangent:

  • Input в radians (не градусы!)
  • \( \sin(0) = 0, \sin(\pi/2) = 1, \sin(\pi) = 0 \)
  • \( \cos(0) = 1, \cos(\pi/2) = 0, \cos(\pi) = -1 \)

Conversion: Radians = Degrees × (π/180) ≈ Degrees × 0.0175

Применение:

  • Циклическое движение (looping animation)
  • Круговая траектория (combine sin/cos)
  • Wave patterns

Пример (circular motion):

Time (в секундах)
    ↓ Math (Multiply by 2π)
    ↓ [Sine → умножить на Radius → X координата]
      [Cosine → умножить на Radius → Y координата]
    ↓ Combine XYZ
    ↓ Set Position

Modulo (остаток от деления)

Формула: A mod B = остаток от A/B

Применение:

  • Повторяющиеся паттерны (каждый N-й элемент)
  • Quantization (округление к ближайшему increment)
  • Циклические индексы

Пример (выбрать каждый 5-й элемент):

Index node
    ↓
Math (Modulo 5)
    ↓
Compare (== 0)
    ↓ Boolean selection

Smoothstep — гладкий переход

Формула: Гладкий переход от 0 к 1 между Edge0 и Edge1

Входы:

  • Edge (может быть Edge0/Edge1) — граница перехода
  • Value — значение для проверки

Результат:

  • Ниже Edge0 = 0
  • Между Edge0 и Edge1 = гладкое значение от 0 до 1
  • Выше Edge1 = 1

Применение:

  • Easing functions (плавное ускорение/замедление)
  • Soft falloff (вместо резкого)
  • Smooth LOD transitions

Практические примеры Math

Пример 1: Пульсирующее движение

Time node
    ↓
Math (Multiply by 2π × frequency)
    ↓
Math (Sine)
    ↓
Scale by amplitude
    ↓
Add к базовой позиции

Пример 2: Spiral параметры

Time / Period × 2π → angle
Distance from center (рассчитано) → radius
Z coordinate proportional to time → height

X = radius × Cos(angle)
Y = radius × Sin(angle)
Z = height

Лучшие туториалы (УРОВЕНЬ 2.2)

  1. Vector Math Made Easy - CGCookie

    • Сводка: Best introduction к Vector Math. Очень понятно.
    • Длительность: Статья (~30 минут чтения)
    • Уровень: Новичок
    • ОБЯЗАТЕЛЬНО: Прочитайте перед началом Level 2
  2. Vector math is EASY when you SEE it - YouTube

    • Сводка: Визуализация концепций вектора. Очень хорошо для понимания.
    • Длительность: ~20 минут
    • Уровень: Новичок-Средний
  3. Math Node Explained - YouTube

    • Сводка: Инженерный подход ко всем операциям Math node.
    • Длительность: ~35 минут
    • Уровень: Средний
    • Изучите: Все основные операции
  4. Trigonometric Animation - YouTube

    • Сводка: Использование Sine/Cosine для анимации.
    • Длительность: ~25 минут
    • Уровень: Средний
  5. Map Range Magic - BlenderArtists

    • Сводка: Как правильно использовать Map Range для falloff.
    • Формат: Форумное обсуждение
    • Полезность: Высокая

МОДУЛЬ 2.3: RAYCAST И PROXIMITY — ВЗАИМОДЕЙСТВИЕ ГЕОМЕТРИЙ

Концепция: Две ноды для "видения" других объектов

Raycast — Отслеживание лучей

Назначение: Отслеживать лучи от одной геометрии на другую (как лазер)

Входы:

  • Target Geometry — геометрия на которую отслеживаем
  • Ray Direction — направление луча
  • Ray Length — максимальная длина луча
  • Source Position — откуда начинается луч

Выходы:

  • Hit Position — где луч попал
  • Hit Distance — расстояние до попадания
  • Hit Normal — нормаль в точке попадания
  • Is Hit — был ли hit (Boolean)

Применение:

  • Ground snapping (ray вниз на земля)
  • Collision detection
  • Line of sight checks
  • Scanner effects

Лайфхак: Ray Direction обычно (0, 0, -1) для вниз


Proximity — Ближайшая точка на геометрии

Назначение: Найти ближайшую точку на target геометрии

Входы:

  • Target Geometry — где искать ближайшую точку
  • Sample Position — от где ищем

Выходы:

  • Position — ближайшая точка на target
  • Distance — расстояние до неё

Применение:

  • Attractor systems (объекты тянутся к целям)
  • Falloff effects (эффект убывает с расстоянием)
  • Deformation based on proximity
  • Collection avoidance

Лайфхак: Combine с Map Range для плавного falloff


Лучшие туториалы (УРОВЕНЬ 2.3)

  1. Raycast Node Explained - YouTube

    • Сводка: Полное объяснение Raycast с примерами.
    • Длительность: ~25 минут
    • Уровень: Средний
    • Изучите: Hit Position, Hit Distance, Hit Normal, Is Hit
  2. How RAYCAST Works - Xan 3D

    • Сводка: Подробный разбор с визуализацией лучей.
    • Длительность: ~25 минут
    • Уровень: Средний
    • Проекты: Ground snapping, Scanner effect
  3. Geometry Proximity - YouTube

    • Сводка: Attractor systems и falloff через Proximity.
    • Длительность: ~20 минут
    • Уровень: Средний
    • Изучите: Combine с Map Range
  4. Raycast vs Proximity - BlenderArtists

    • Сводка: Когда использовать что.
    • Формат: Форумное обсуждение

Практический проект P2.3: "Ground Snapping с Raycast"

Сложность: Средний
Время: 1.5-2 часа
Используемые ноды: Raycast, Set Position, Rotate Align to Vector

Описание:
Рассеивание объектов на ландшафт так, чтобы они следовали поверхности (как в real game).

Что вы изучите:

  • Raycast для ground snapping
  • Ориентирование по нормали поверхности
  • Комбинирование нескольких техник

ФИНАЛЬНЫЙ ПРОЕКТ УРОВНЯ 2

🎬 ПРОЕКТ R.4: "Параметрический процедурный город"

Сложность: Advanced
Время: 8-12 часов
Навыки: Все из Level 2

Описание:
Полностью процедурный город с зданиями, улицами, вариациями, которым можно управлять через параметры.

Требования:

  • Multiple типы зданий
  • Случайные вариации (размер, цвет, детали)
  • Улицы и планировка
  • Параметры для контроля плотности, стиля, и т.д.
  • Хорошо организованный node tree
  • Оптимизирован через инстансы

Лучшие туториалы:


КОНТРОЛЬНЫЙ ЧЕК-ЛИСТ УРОВНЯ 2

Fields & Attributes

  • Понимаю разницу между Field и Attribute
  • Могу использовать Capture Attribute для сохранения позиции
  • Могу использовать Store Named Attribute для экспорта в шейдеры
  • Понимаю домены (Point, Edge, Face, Corner, Spline)
  • Могу диагностировать проблемы с атрибутами через Spreadsheet

Math & Vector Math

  • Знаю когда использовать Dot Product vs Cross Product
  • Могу создать circular motion через Sine/Cosine
  • Понимаю Modulo для повторяющихся паттернов
  • Могу использовать Map Range для falloff
  • Знаю что Input в Math Sine/Cosine в радиях, а не градусах

Raycast & Proximity

  • Могу использовать Raycast для ground snapping
  • Могу создать attractor system через Proximity
  • Понимаю разницу между Raycast и Proximity
  • Могу комбинировать их для сложных эффектов

Общее

  • Могу создать параметрическую систему
  • Могу организовать complex node tree
  • Могу диагностировать и исправлять ошибки
  • Готов к Level 3!

Навигация

Авторы

  • Volumorph - @volumorph
  • David "Dr. Strange" Ayrapetian - @david_ayrapetiann
  • Maxim "Dr. Artist" Zhuravlev - @WhiteCatWeb
  • Manachrome Factory - @Manachrome_Factory
  • Artyom "Биполярыч" Sidorov - @artyomsidorov25
  • Pepsied "Cola" - @pepsiedina